/*
 * Description: wait user logon in windows
 */
#ifndef SESSION_UTILS_H
#define SESSION_UTILS_H

#include <mutex>
#include <functional>
#include <vector>
#include <windows.h>
#include "singleton.h"
#include <map>

namespace COMMON {
class SessionUtils {
    using SessionCallback = std::function<void()>;
    using SessionChangeCallback = std::function<void(int32_t)>;

public:
    /********************
     * 函数：Init
     * 功能：初始化WinManager
     * 参数：NA
     * 返回：NA
     ********************/
    static void Init();

    /********************
     * 函数：RegLogonCallback
     * 功能：注册用户登陆事件回调
     * 参数：NA
     * 返回：NA
     ********************/
    static void RegLogonCallback(const SessionCallback &fn)
    {
        m_logonCallbacks.push_back(fn);
    }

    /********************
    * 函数：IsUserLogon
    * 功能：当前是否有用户登陆
    * 参数：NA
    * 返回：是否有用户登陆
    ********************/
    static bool IsUserLogon();

    /********************
    * 函数：Lock
    * 功能：锁屏
    * 参数：NA
    * 返回：NA
    ********************/
    static void Lock();

    /********************
     * 函数：RegSessionChangeCallback
     * 功能：注册session事件回调
     * 参数：回调方法
     * 返回：NA
     ********************/
    static void RegSessionChangeCallback(const std::string& name, const SessionChangeCallback& fn);

    /********************
     * 函数：UnRegSessionChangeCallback
     * 功能：解注册session事件回调
     * 参数：回调方法
     * 返回：NA
     ********************/
    static void UnRegSessionChangeCallback(const std::string& name);

private:
    static std::vector<SessionCallback> m_logonCallbacks;
    static bool m_flag; //用户是否已经登陆过
    static std::map<std::string, SessionChangeCallback> m_sessionCallbackMap_;
    static std::mutex m_mutex_;

    static void dealMsg(MSG msg);
    /********************
     * 函数：SessionChange
     * 功能：监视windows内用户的登陆、注销事件
     * 参数：NA
     * 返回：NA
     ********************/
    static void SessionChange();
    static void SetQuickStartStatus();
};

} // namespace COMMON

#endif // SESSION_UTILS_H